<?php 

/**
* 客户端请求分发路由控制器
*/
class Dispatcher
{
	
	private $model_name="";

	private $func_name="";


	function __construct()
	{
		# code...
	}


	//解析请求路径，并做对应转发
	function dispatch(){

		//获取客户端请求url
		$url=$_SERVER["REQUEST_URI"];

		print_log("access url:$url");

		
		try {	

			//从url中分离出模块名称、方法名称、参数列表
			$this->getModelAndFunc($url);

			//设置 模块文件路径
			$model_path="server/".$this->model_name."Server.php";

			//检查模块文件是否存在
			if(!file_exists($model_path)){

				throw new Exception("Error Processing Request. model:$this->model_name model not found", 400);
				
			}

			//实例化模型类
			include $model_path;

			$model_class_name=$this->model_name."Server";

			$model=new $model_class_name();

			//检查方法是否存在
			if(!method_exists($model_class_name, $this->func_name)){

				throw new Exception("Error Processing Request. func:$this->func_name function not found", 400);				
			}

			//执行方法. 客户端ip必须传递
			$f_name=$this->func_name;
			
			$model->$f_name();
			
		} catch (Exception $e) {

			$data["code"]=$e->getCode();
			$data["msg"]=$e->getMessage();

			header('Content-Type: application/json; charset=utf-8');
		
			echo json_encode($data);

		}


	}

	// 获取请求的模块名称， 方法名称
	function getModelAndFunc($url){

		global $conf;

		$app_name=$conf["APP_NAME"];

		//将 /api/index.php 从 url 中删除

        //过滤应用名称(如果有)
        $url=str_replace("/$app_name","",$url);

        //过滤 index.php
		$url=str_replace("/index.php", "", $url);

		$temp_url=$url;	

		//如果有请求参数，去除url中参数部分
		if(!empty($_GET)){	

			$temp_url=substr($url, 0,stripos($url, "?"));
		}

		//如果截取后字符串为空，表示客户端直接请求 index.php，抛出异常
		if(empty($temp_url)) throw new Exception("You Request index.php", 400);	

		//将字符串转换为数组
		$temp_array=explode("/", $temp_url);

		//如果转换后的数组长度不是3，表示请求格式异常。抛出
		if(count($temp_array)!=3) throw new Exception("Error format Request", 400);	

		//获取 模块名称
		$this->model_name=$temp_array[1];

		//获取 方法名称
		$this->func_name=$temp_array[2];

	}
}

